/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.siswebvendas.produtoTeste;

import br.com.siswebvendas.produto.Produto;
import br.com.siswebvendas.util.HibernateUtil;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;


import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 *
 * @author Robson
 */
public class ProdutoTeste {

    private static Session session;
    private static Transaction transacao;

    @BeforeClass
    public static void abreConexao() {
        session = HibernateUtil.getSession().getCurrentSession();
        transacao = session.beginTransaction();

    }
    //Fecha conexao com o banco

    @AfterClass
    public static void fechaConexao() {

        try {
            transacao.commit();

        } catch (Throwable e) {
            System.out.println("Problema ao realizar o Commit da Tranzação" + e.getMessage());
        } finally {

            try {
                if (session.isOpen()) {
                    session.close();
                }
            } catch (Exception ex) {

                System.out.println("Ocorreu um erro durante o "
                        + "fechamento da sessão" + ex.getMessage());
            }
        }
    }

    @Before // 
    public void setup() {
        Produto p1 = new Produto("loto", "tabela", new Date(), 19, 10.5f);
        Produto p2 = new Produto("quilo", "regua", new Date(), 39, 2.5f);
        Produto p3 = new Produto("fardo", "papel", new Date(), 20, 2.3f);
        Produto p4 = new Produto("edicao", "litro", new Date(), 500, 9.5f);
        Produto p5 = new Produto("litro", "agua", new Date(), 55, 2.9f);

        session.save(p1);
        session.save(p2);
        session.save(p3);
        session.save(p4);
        session.save(p5);
    }

    @After
    public void limpaBancoDeDados() {
        Criteria lista = session.createCriteria(Produto.class);
        @SuppressWarnings("unchecked")
        List<Produto> produtos = lista.list();

        for (Produto produto : produtos) {
            session.delete(produto);
        }
    }

    //  teste de Inserção de dados No Banco
    @Test
    public void salvarProdutoTeste() {
        Query consulta = pesquisar("litro");
        Produto produtoPesquisado = (Produto) consulta.uniqueResult();
        assertEquals("agua", produtoPesquisado.getUnidade());
    }

    @Test
    public void listaProdutoTest() {
        Criteria lista = session.createCriteria(Produto.class);
        @SuppressWarnings("unchecked")
        List<Produto> produtos = lista.list();
        assertEquals(5, produtos.size());
    }

    public void excluirPrdutoTeste() {
        Query excluir = pesquisar("litro");
        Produto produtoExcluido = (Produto) excluir.uniqueResult();
        session.delete(produtoExcluido);
        produtoExcluido = (Produto) excluir.uniqueResult();
        assertNull(produtoExcluido);

    }

    @Test
    public void alteracaoProduto() {
        Query consulta = pesquisar("litro");
        Produto produtoAlterar = (Produto) consulta.uniqueResult();
        produtoAlterar.setEstoque(100);
        session.update(produtoAlterar);
        produtoAlterar = (Produto) consulta.uniqueResult();
        assertEquals(100, produtoAlterar.getEstoque().intValue());
    }

    private Query pesquisar(String parametro) throws HibernateException {
        String sql = "from Produto p where p.descricao like :descricao";
        Query consulta = session.createQuery(sql);
        consulta.setString("descricao", "%" + parametro + "%");
        return consulta;
    }
}
